/**
 * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
 *
 * 
 * @param array int整型一维数组 
 * @return int整型一维数组
 */
 function FindGreatestSumOfSubArray( array ) {
  // write code here
  // 创建动态规划辅助数组 记录到下标i为止的连续子数组的最大和 下标为0 的时候 肯定等于原数组下标为0的元素
  var dp = new Array(array.length) //创建一个动态数组 
  dp[0] = array[0] //第0位就是array[0]
  var maxsum = dp[0] // 初始的最大值也是array[0]
  // 定义滑动区间
  var left = 0 // 初始的左区间是0
  var right = 0 // 初始的右区见也是0
  // 定义最长的区间
  var resl = 0 // 初始最长左区间是0
  var resr = 0 // 初始最长右边界也是0
  for(let i = 1;i < array.length;i++){ // 从第一个开始遍历 一直到最后一个
    right++ // 右边界右移
    dp[i] = Math.max(dp[i-1]+array[i],array[i]) // 获得此时的dp[i]
    if(dp[i-1]+array[i] < array[i]){ // 如果此时的dp[i]是当前元素的值的话
      left = right // 就让左右边界相等
    }
    if(dp[i] > maxsum || dp[i] === maxsum && (right - left + 1) > (resr - resl + 1)){ // 否则的话 当dp[i]大于最大值 最大值更新的时候 或者dp[i] === maxsum的时候 同时 左右边界的最大值大于原来边界的最大值的时候
      maxsum = dp[i] // 此时的最大值换成dp[i]
      resl = left // 最长左边界换成左边界
      resr = right //最长右边界换成右边界
    }
  }
  var res = new Array(resr-resr+1)
  for(let i = resl;i<=resr;i++){
    res[i-resl] = array[i]
  }
  return res
}
module.exports = {
  FindGreatestSumOfSubArray : FindGreatestSumOfSubArray
};